#include <iostream>
#include <unistd.h>
#include <sys/select.h>
int main()
{
    fd_set read_fd;
    while (true)
    {
        // 由于select文件描述符集用户和内核公用一个,导致每次自己设置的文件描述符集会被修改
        // 所以必须重新设置文件描述符集
        FD_ZERO(&read_fd);
        FD_SET(0, &read_fd);
        printf("> ");
        fflush(stdout);
        // 需要监听的fd最大值+1/读文件描述符集/写~/异常~/struct timeval超时返回{0,0} nullptr为阻塞式
        int n = select(1, &read_fd, nullptr, nullptr, nullptr);
        if (n < 0)
        {
            perror("select");
            continue;
        }
        // 上面设置的是阻塞式等待,走到这里说明此时一定是等待成功了
        if (FD_ISSET(0, &read_fd)) // 检查文件描述符是否被设置了
        {
            char buffer[1024] = {0};
            int n = read(0, buffer, sizeof(buffer) - 1);
            if (n > 0)
            {
                buffer[n] = 0;
                std::cout << buffer << std::endl;
            }
        }
        else // 文件描述符没有被设置
        {
            printf("Error! Invalid fd\n");
            continue;
        }
    }
    return 0;
}